//
//  RevanMainViewController.swift
//  weibo_swift
//
//  Created by 紫荆秋雪 on 16/11/29.
//  Copyright © 2016年 紫荆秋雪. All rights reserved.
//

import UIKit
import SVProgressHUD

//MARK: - 1、系统生命周期
class RevanMainViewController: UITabBarController {
    
    // 定时器
    var timer: Timer?
    
    // 1-1、内部属性
    ///1、添加撰写微博按钮
    lazy var composeButton = {()->UIButton in
        let sendButton = UIButton()
        sendButton.setImage(UIImage(named: "tabbar_compose_icon_add"), for: .normal)
        sendButton.setImage(UIImage(named: "tabbar_compose_icon_add_selected"), for: .selected)
    sendButton.setBackgroundImage(UIImage(named:"tabbar_compose_button"), for:.normal)
    sendButton.setBackgroundImage(UIImage(named:"tabbar_compose_button_selected"), for: .selected)
        
        return sendButton
    }()

    // 1-2、系统生命周期方法
    override func viewDidLoad() {
        super.viewDidLoad()
        /// 设置UITabBarController的子类
        setupChildControllers()
        /// 添加撰写微博按钮
        setupComposeFunc()
        /// 定时器
        setupTimer()
        // 注册通知 - 弹出登录界面
        RevanNotificationCenter.addObserver(self, selector: #selector(userLogin), name: NSNotification.Name(rawValue: RevanUserShouldLoginNotification), object: nil)
        // 遵守代理
        delegate = self
        // 新特性界面/欢迎界面
        setupNewFeatureViews()
    }
    
    // MARK: - 析构函数
    deinit {
        // 销毁时钟
        timer?.invalidate()
        // 注销通知
        NotificationCenter.default.removeObserver(self)
    }
    
    
    // Method does not override any method from its superclass
    // 1-4、设置支持屏幕方向
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

    //MARK: - 监听点击事件方法
    /// 用户登录
    @objc func userLogin(n: Notification) {
        print("用户登录 \(n)")
        var deadline = DispatchTime.now()
        if n.object != nil {// token过期
            deadline = deadline + 2
            //提示用户
            SVProgressHUD.showInfo(withStatus: "登录时间过期，请从新登录")
        }
        DispatchQueue.main.asyncAfter(deadline: deadline) {
            let oauthVC = RevanOAthViewController()
            // 包装一个导航控制器
            let nav = UINavigationController(rootViewController: oauthVC)
            // modal出来控制器
            self.present(nav, animated: true, completion: nil)

        }
        
    }
    /// 撰写微博
    @objc func composeButtonClick() {
        print("撰写微博")
    }
    
    
    
    
}

//MARK: - 2、设置UITabBarController的子类
extension RevanMainViewController {
    
    //MARK: - 1、设置所有的子控制器
    func setupChildControllers() {
        /// 0、获取沙盒路径
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath  = (path as NSString).appendingPathComponent("main.json")
        /// 1、通过沙盒路径来获取内容
        var data = NSData(contentsOfFile: jsonPath)
        
        /// 2、判断是否存在data
        if data == nil {
            guard let path = Bundle.main.path(forResource: "main.json", ofType: nil) else {
                return
            }
            data = NSData(contentsOfFile: path)
        }
        
        ///1、创建描述 子控制器 的数组
        // Value of type 'String' does not conform to expected dictionary value type 'AnyObject'
        /// 路径
        guard let array = try? JSONSerialization.jsonObject(with: data as! Data, options: []) as? [[String: Any]]
        else {
            return
        }
        
        //MARK: - 2、创建一个存储控制器的数组
        var arrayM = [UIViewController]()
        for dictM in array! {
            //把通过 字典创建出来的控制器 存储到 数组中
            // Cannot convert value of type 'Dictionary<String, Any>' to expected argument type '[String : String]'
            arrayM.append(controler(dict: dictM))
        }
        ///3、把装有 子控制器的 数组赋值给
        viewControllers = arrayM
    }
    
    /// 2、使用 字典创建一个子控制器
    /// - parameter dict[clsName:"控制器类字符串", title: "标题名称", imageName: "图标名称"]
    private func controler(dict:[String: Any]) -> UIViewController {
        /// 1、获取字典内容
        guard let clsName = dict["clsName"] as? String,
              let title = dict["title"] as? String,
            let imageName = dict["imageName"] as? String,
            let visitorInfo = dict["visitorInfo"] as? [String : String],
            let cls = NSClassFromString(Bundle.main.bundleNameSpace + "." + clsName) as? RevanBaseViewController.Type
            
        else {
            return UIViewController()
        }
        //2、创建视图控制器
        let vc = cls.init()
        // 配置访客视图信息
        vc.visitorInfoDict = visitorInfo
        //3、设置标题
        vc.title = title
        //4、设置图像
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)
        //5、设置文字颜色及其大小
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.orange], for: .selected)
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName : UIFont.systemFont(ofSize: 12)], for: .normal)
        
        //6、包装导航控制器
        let nav = RevanNavigationController(rootViewController: vc)
        
        return nav
    }
    
    //MARK: - 3、添加撰写微博按钮
    func setupComposeFunc() {
        //3.1、撰写微博 添加 到 tabBar中
        tabBar.addSubview(composeButton)
        //3.2、tabBar中每个按钮的宽度
        let count = CGFloat(childViewControllers.count)
        /// '-1'是为了‘容错’，让'撰写微博按钮'的宽度更大
        let w = tabBar.bounds.size.width / count
        // 添加 容错 判断后使用上面的方法
        //let w = tabBar.bounds.size.width / count - 1
        //3.2、设置撰写微博的偏移量
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
//        composeButton.sizeToFit()
        print(composeButton.frame.size.width)
        
        composeButton.addTarget(self, action: #selector(composeButtonClick), for: .touchUpInside)
    }
}

// MARK: - 3、时钟方法
extension RevanMainViewController {
    // 定义时钟
    func setupTimer() {
        timer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(updateTimer), userInfo: nil
            , repeats: true)
    }
    
    /// 时钟触发方法
    @objc func updateTimer() {
        //如果用户没有登录也就不需要监听这些了
        if RevanUserAccount().access_token == nil {
            return
        }
        
        print("时钟触发方法")
        // 发送请求获取 未读数
        RevanNetworkManager.shared.unreadCount { (count) in
            print("有\(count)条未读数")
            // 设置首页 tabBarItem 的badgeValue
            self.tabBar.items?[0].badgeValue = count > 0 ? "\(count)" : nil
            
            // 设置app右上角的角标
            UIApplication.shared.applicationIconBadgeNumber = count
        }
    }
}

// MARK: - UITabBarControllerDelegate 代理方法
extension RevanMainViewController: UITabBarControllerDelegate {
    /*
        这个UITabBarControllerDelegate的代理方法的目的：就是判断是否要跳转到点击的TabBar控制器，
        如果返回是 YES，那就跳转到点击的TabBar控制器
        如果返回是 NO，那么就不跳转到点击的TabBar控制器
     */
    /// 将要选择 TabBarItem
    ///
    /// - Parameters:
    ///   - tabBarController: tabBarController
    ///   - viewController: 目标控制器
    /// - Returns: 是否切换到目标控制器
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        
        // 1、获取点击的控制器在数组中的 索引
        let idx = (childViewControllers as NSArray).index(of: viewController)
        // 2、判断当前索引是 首页，同时 idx 也是首页，也就表明重复点击了 首页
        if selectedIndex == 0 && idx == selectedIndex {// 重复点击了首页
            print("重复点击了首页")
            // 3、让表格滚动到顶部
            // 获取到首页控制器
            let nav = childViewControllers[0] as! UINavigationController
            let vc = nav.childViewControllers[0] as! RevanHomeViewController
            // 让表格滚动到顶部
            vc.tableView?.setContentOffset(CGPoint(x: 0, y: -64), animated: true)
            // 加载数据
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: { 
                vc.loadData()
            })
            
            // 清空tabBar bageVlaue
            vc.tabBarItem.badgeValue = nil
            // 清空App的 bageVlaue值
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
        
        
        
        // 如果判断点击的目标控制器viewController是UIViewController 类型，就不跳转
        return !viewController.isMember(of: UIViewController.self)
        // 所以通过这个代理方法，就可以很好的解决 发布微博 按钮的容错问题（点击 发布微博 可能弹出空白控制器）
    }
}

// MARK: - 新特性 / 欢迎界面
extension RevanMainViewController {
    /// 设置新特性视图
    func setupNewFeatureViews() {
        // 1、如果更新，显示新特性，否则显示欢迎界面
        let v = isNewVersion ? RevanNewFeatureView.newFeature() : RevanWelcomeView.welcome()
        // 2、添加视图
        v.frame = view.bounds
        
        view.addSubview(v)
    }
    
    /// extension 中可以有计算型属性，不会占用存储空间
    private var isNewVersion: Bool {
        // 获取版本号
        let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
        // 获取保存在 "Document(iTunes备份)[最理想保存在用户偏好]"
        let path = "version".docDir()
        let sandboxVersion = (try? String(contentsOfFile: path)) ?? ""
        
        // 将当前版本号存储到沙盒中
        _ = try? currentVersion.write(toFile: path, atomically: true, encoding: .utf8)
        // 返回 判断两个版本是否一致 结果
        return currentVersion != sandboxVersion
    }
}














